<?php
/**
 * User_Administration
 *
 * Класс User_Administration осуществляет работу по перке прав на администрирование
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class User_Administration extends ActiveRecord {
	public $tableName = 'administration';
	public $pkName = 'ID_administration';

	public $user = null;
	public $essenceType = null;
	public static $notAdminContent = false;

  public function __construct($arrInitialFields = null) {
		parent::__construct($arrInitialFields);
		$this->user = new BelongsTo(array('className' => 'User_User', 'foreignKey' => 'ID_user'));
		$this->essenceType = new BelongsTo(array('className' => 'Service_Essence', 'foreignKey' => 'ID_essence_type'));
  }
  /**
   * Получает текущий уровень доступа пользователя
   *
   * @param integer $administrationType
   * @param integer $userId
   * @return integer
   */
  public static function getAdministrationLevel($administrationType, $userId = null) {
    if ($userId == null) {
      $objSession = User_Session::instance();
      $userId = $objSession->getUserId();
    }
    if (!$userId)
      return 0;
    $objDB = Service_Database::instance();
    $stmt = "SELECT `administration`.`level` FROM `administration` WHERE `ID_essence_type` = '" . $administrationType . "' AND `ID_user` = '" . $userId . "'";
    $level = $objDB->selectSimpleField($stmt);
    return intval($level);
  }
  /**
   * Определяет, имеет ли пользователь доступ к администрированию
   *
   * @param mixed $administrationAction
   * @param integer $level
   * @param integer $creatorId
   * @param integer $userId
   * @return bool
   */
  public static function isAdministrationAviable($administrationAction, $level, $creatorId = null, $userId = null) {
    if ($userId == null) {
      $objSession = User_Session::instance();
      $userId = $objSession->getUserId();
    }

    $isCreator = false;
    if ($creatorId != null)
      if ($creatorId == $userId)
        $isCreator = true;
    $necessaryLevel = self::getNecessaryLevel($administrationAction, $isCreator);
    if ($necessaryLevel > $level)
      return false;
    else
      return true;
  }
  /**
   * бходимый для администрирования уровень
   *
   * @param mixed $administrationAction
   * @param bool $isCreator
   * @return integer
   */
  private static function getNecessaryLevel($administrationAction, $isCreator = false) {
    $actionId = self::getActionId($administrationAction);
    switch ($actionId) {
      case 1://Добавление
        return 2;
      case 2://Редактирование
        if ($isCreator) {
          if(self::$notAdminContent)
            return 0;
          else 
            return 2;
        }
        else
          return 4;
      case 3://Удаление
        if ($isCreator) {
					if(self::$notAdminContent)            
        	  return 0;
          else 
            return 3;
        }
        else
          return 5;
      case 4://Просмотр
          return 1;
      default:
        return 999;
    }
  }
  /**
   * Преобразует название действия к числу
   *
   * @param mixed $actionName
   * @return integer
   */
  public static function getActionId($actionName) {
    if ( is_int($actionName) )
      return $actionName;
    switch ($actionName) {
      case 'add':case 'ad':
        return 1;
      case 'edit':case 'ed':
        return 2;
      case 'del':case 'delete':
        return 3;
      case 'view':case 'show':
        return 4;
      default:
        return 0;
    }
  }

  /**
   * Проверяет, достаточно ли прав у пользователя для выполнения действия
   *
   * @param integer $administrationType
   * @param integer $administrationAction
   * @param integer $creatorId
   * @param integer $userId
   */
  public static function checkAccess($administrationType, $administrationAction, $creatorId = null, $userId = null) {
    $level = self::getAdministrationLevel($administrationType, $userId);
    if (!self::isAdministrationAviable($administrationAction, $level, $creatorId, $userId)) {
			User_Session::moveTo(W_ABSPATH, 'У Вас недостаточно прав для выполнения действия', -1);
    }
    return true;
  }
  /**
   * Проверяет, достаточно ли прав у пользователя для выполнения действия
   *
   * @param integer $administrationType
   * @param integer $administrationAction
   * @param integer $creatorId
   * @param integer $userId
   * @return bool
   */
  public static function checkAccessForAjax($administrationType, $administrationAction, $creatorId = null, $userId = null) {
    $level = self::getAdministrationLevel($administrationType, $userId);
    return self::isAdministrationAviable($administrationAction, $level, $creatorId, $userId);
  }

  /**
   * Проверяет, достаточно ли прав у пользователя для просмотра инвайтов
   *
   * @param integer $userId
   */
  public static function checkAccessInvites() {
  	if (self::getAdministrationLevel(6)) return true;
  	else {
  		return false;
  	}
  }

	public static function freeEssenceAdministrators($essenceId) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="DELETE FROM `administration` WHERE `ID_essence_type`='" . intval($essenceId) . "'";
		return $objDB->query($stmt);
	}
	public static function freeUserRights($userId) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="DELETE FROM `administration` WHERE `ID_user`='" . intval($userId) . "'";
		return $objDB->query($stmt);
	}

	/**
	 * Метод сохраняет в БД информацию о пользователях, которые имеют права на работу с сущностью
	 *
	 * @param object $objEssence
	 * @return bool
	 */
  public static function saveEssenceAdminRights($objEssence) {
		$errorInLevels = false;
		$arrUsers = &$objEssence->tableFields['User_User'];
		//for ($i = 0; $i < sizeof($arrUsers); $i++) {
		if($arrUsers) foreach ($arrUsers as $i => $arrUser) {
			$objAdmin = new User_Administration($arrUsers[$i]);
		  $arrUsers[$i]['ID_user'] = User_User::getIdByLogin(Service_Function::absolutelyEscapeString($arrUsers[$i]['login']));
		  if(!$arrUsers[$i]['ID_user']) {
		    Exception_ActiveRecord::addObjectException('User_User', 'login', 'пользователя с таким логином не ууществует', $i);
		  	$errorInLevels = true;
		  }
		  if(!$objAdmin->validateNumericalityOf('level', array('errorOf' => 'User_User', 'complex' => $i)))
		    $errorInLevels = true;
		}
		if(!$errorInLevels) {
			User_Administration::freeEssenceAdministrators($objEssence->id);
			//for ($i = 0; $i < sizeof($arrUsers); $i++) {
			if($arrUsers) foreach ($arrUsers as $i => $arrUser) {
			  self::_saveAdminRights($objEssence->id, $arrUsers[$i]['ID_user'], $arrUsers[$i]['level']);
			}
		}
		return !$errorInLevels;
  }

  private static function _saveAdminRights($essenceId, $userId, $level) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="INSERT INTO `administration` (`ID_user`, `ID_essence_type`, `level`)
		       VALUES (" . intval($userId) . ", " . intval($essenceId) . ", " . intval($level) . ")";
		return $objDB->query($stmt);
  }
  

	/**
	 * Метод сохраняет в БД информацию сущностях,  которыми может работать пользователь
	 *
	 * @param object $objUser
	 * @return bool
	 */
  public static function saveUserRights($objUser) {
		$errorInLevels = false;
		$arrEssences = &$objUser->tableFields['Service_Essence'];
		/*if($arrEssences) foreach ($arrEssences as $i => $arrEssence) {
			$objEssence = new Service_Essence($arrEssence);
		}*/
		if(!$errorInLevels) {
			User_Administration::freeUserRights($objUser->id);
			if($arrEssences) foreach ($arrEssences as $i => $arrEssence) {
			  self::_saveAdminRights($arrEssence['ID_essence_type'], $objUser->id, $arrEssence['level']);
			}
		}
		return !$errorInLevels;
  }

}
?>